package com.tom.joke.daily.daily3.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

// 类的代理
public class ProxyUtil {
    //给明星对象创建一个代理，传入被代理的明星对象；返回 创建的代理
    public static IStar createProxy(BigStar bigStar) {
// public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
//参数1：指定用哪个类加载器，去加载生成代理类。
//参数2：指定接口，这些接口用于指定生成的代理长什么样，也就是有哪些方法。
//参数3：用来指定生成的代理对象要干什么事情。
        IStar iStar = (IStar) Proxy.newProxyInstance(
                ProxyUtil.class.getClassLoader(),
                new Class[]{IStar.class}, // 代理接口中所有的抽象方法。
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        // ② 自动调用invoke方法。
                        // invoke：代理要干的事情。
                        //参数一：proxy 代理的对象，一般不使用
                        //参数二：method 要运行的方法sing,dance
                        //参数三：args 调用sing方法的时候，传递的实参: "菊花台"
                        if ("sing".equals(method.getName())) {
                            // ③。进行if判断是哪个方法
                            System.out.println("准备话筒，收钱");
                        } else if ("dance".equals(method.getName())) {
                            System.out.println("准备跳舞场地，收钱");
                        }
                        // ④。调用大明星的sing方法。
                        Object result = method.invoke(bigStar, args);
                        System.out.println("---方法执行结束---");
                        return result; // ⑤。将方法调用返回值 返回。
                    }
                }
        );
        return iStar;
    }
    // 1.代理对象 = ProxyUtil.createProxy(明星对象)
    // 2.调用代理的唱歌方法：代理对象.sing("");  它会调用invoke() 方法。

}
